package com.yhn.init.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.validation.constraints.NotNull;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**线程池配置类
 * @author 86177
 */
@Configuration
public class ThreadPoolExecutorConfig {
   //配置一个线程池
   @Bean
   public ThreadPoolExecutor threadPoolExecutor() {
      //创建一个线程工厂，控制每一个线程的生成和属性
      ThreadFactory threadFactory = new ThreadFactory() {
         //初始化线程数为1
         private int count = 1;

         @Override
         /*
           每当线程池需要创建新线程时就会调用newThread方法
           @NotNull Runnable r 表示方法参数r永远不会为null，如果调用这个方法时传递了一个null参数就会报错
          */
         public Thread newThread(@NotNull Runnable r) {
            // ，创建了一个新线程，一定要将这个 r 放入到线程当中
            Thread thread = new Thread(r);
            //设置线程名称
            thread.setName("线程：" + count);
            // 任务++
            count++;
            //返回创建的现场
            return thread;
         }
      };
      //默认是AbortPolicy策略
      //创建一个线程池，核心大小是2，最大线程是4，任务队列为阻塞队列，只有自定义的线程工厂创建
      ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 4, 100, TimeUnit.SECONDS,
              new ArrayBlockingQueue<>(100), threadFactory);
      return threadPoolExecutor;
   }
}
